#函数
#定义函数
def hi_user():  #关键字def告诉python 定义一个函数，函数名hi_user()
    ###简单问候###    在为函数生成文档时，会查找跟在函数定义后的字符串
    print('hi') #所有缩进构成了函数体
hi_user()  #使用函数必须调用
#向函数传递信息   在括号内添加name，可以让函数接受你给name指定的任何值
def user(name):
    print(f'hello {name}')
user('45')
#形参和实参
#在上方函数定义中，name作为形参，传递给函数的值‘45’是一个实参
#传递实参
#函数定义可以包含多个形参，也可以包含多个实参
#位置实参，要求实参顺序与形参相同
def animal(name,age):
    print(f'这个动物的名字是{name}')
    print(f'他的年龄是{age}')
animal('旺财',1)
#可以根据需要调用函数多次，如要再描述一个宠物，只需要再调用一次animal()
animal('如花','1岁')
#关键字实参
#关键字实参是传递给函数的名值对，会直接在实参中将名称与值相关联
def peoples(name,sex):
    if sex == 'man':
        print(f'这个人的名字是{name},他的性别是{sex}')
    else:
        print(f'这个人的名字是{name},她的性别是{sex}')
peoples(sex = 'woman' , name = 'sam')
#默认值
#在编写函数时，可以给每个形参指定默认值，如果在调用函数时给形参提供了实参，将使用实参值，否则将使用默认值
def user(name,sex = 'man'):
    print(f'这个人的名字是：{name}，性别是：{sex}')
user('peter')
#返回值
#返回简单的值
def get_formatted_name(first_name,last_name):
    full_name = f'{first_name} {last_name}'
    return full_name.title()
name = get_formatted_name('he','siwu')
print(name)
#让实参变成可选的
#可以使用默认值来让实参变成可选的
def name_1(firstname,lastname,middlename = ''):
    ###并不是所有人都有中间名，所以将中间名指定为空字符串，在用户不提供中间名时，不使用此形参###
    message = f'{firstname} {lastname} {middlename}'
    return message
text = name_1('li','4')
print(text)
#返回字典
#函数可返回任何类型的值，包括列表字典等较为复杂的数据结构
def pets(name,type):
    pets_message = {'name':name,'leixing':type}
    return pets_message
message = pets(name = 'li',type = 'man')
print(message)
#结合使用函数和while循环
def full_score(english,math,chinese):
    #计算总成绩
    total_score = english + math + chinese
    return total_score
while True:
    name = input('告诉我你的名字\n')
    e_score = int(input('告诉我你的英语成绩\n'))
    m_score = int(input('告诉我你的数学成绩\n'))
    c_score = int(input('告诉我你的语文成绩\n'))
    score = full_score(e_score,m_score,c_score)
    print(f'{name}的总成绩是{score}\n')
    active = input('还有人要计算成绩吗？\nyes/no\n')
    if active.lower() == 'no':
        break
